#include "Reporte.h"

vector<string> Reporte::splitS(string str){
	vector<string> vectorS;
	stringstream ss(str);
	string s;

	while (getline(ss, s, ';')) {
	 vectorS.push_back(s);
	}
	return vectorS;
}

void Reporte::cantCopiniosPorFabricante(ABMCorpino *abmC, ABMFamilia *abmF){
       vector<string> vectorC = abmC->listar();
       vector<string> vectorF = abmF->listar();
       vector<string> vectorFab;
       bool existe;
       cout<<endl<<" Listado cantidad de productos por fabricante "<<endl<<endl;

       for(unsigned int i=0; i<vectorF.size();i++){
           string stringFamilia=vectorF.at(i);
           vector<string> vectordatoF=splitS(stringFamilia);
           unsigned int idFamilia=Util::stringToUint(vectordatoF.at(0));
           string descrFabricante=vectordatoF.at(2);
           existe=false;
           for(unsigned int i=0;i<vectorFab.size() ;i++){
               if (splitS(vectorFab.at(i)).at(0)==descrFabricante) existe=true;
               break;
           }
           if (!existe) vectorFab.push_back(descrFabricante+";"+Util::intToString(idFamilia));
       }
       for(unsigned int i=0; i<vectorFab.size();i++){
           int cantFabricante=0;
           string stringFabricante=splitS(vectorFab.at(i)).at(0);
           unsigned int idFamilia=Util::stringToUint(splitS(vectorFab.at(i)).at(1));
           for(unsigned int i=0; i<vectorC.size();i++){
               string stringCorpino=vectorC.at(i);
               vector<string> vectordatoC=splitS(stringCorpino);
                if (Util::stringToUint(vectordatoC.at(7))==idFamilia) cantFabricante++;
           }
           cout<<"  Cantidad para fabricante "<<stringFabricante<<": "<<cantFabricante<<endl;
       }
       cout<<endl;
}

void Reporte::listarCorpiniosPorFabricante(ABMCorpino *abmC, ABMFamilia *abmF){
           vector<string> vectorC = abmC->listar();
           vector<string> vectorF = abmF->listar();
           vector<string> vectorFab;
           bool existe;

           cout<<endl<<" Listado de corpiños por fabricante "<<endl<<endl;

           for(unsigned int i=0; i<vectorF.size();i++){
               string stringFamilia=vectorF.at(i);
               vector<string> vectordatoF=splitS(stringFamilia);
               unsigned int idFamilia=Util::stringToUint(vectordatoF.at(0));
               string descrFabricante=vectordatoF.at(2);
               existe=false;
               for(unsigned int i=0;i<vectorFab.size() ;i++){
                   if (splitS(vectorFab.at(i)).at(0)==descrFabricante) existe=true;
                   break;
               }
               if (!existe) vectorFab.push_back(descrFabricante+";"+Util::intToString(idFamilia));

           }
           for(unsigned int i=0; i<vectorFab.size();i++){
               string stringFabricante=splitS(vectorFab.at(i)).at(0);
               cout<<endl<<"   Fabricante "<<stringFabricante<<": "<<endl<<endl;
               unsigned int idFamilia=Util::stringToUint(splitS(vectorFab.at(i)).at(1));
               for(unsigned int i=0; i<vectorC.size();i++){
                   string stringCorpino=vectorC.at(i);
                   vector<string> vectordatoC=splitS(stringCorpino);
                    if (Util::stringToUint(vectordatoC.at(7))==idFamilia){
                     cout <<"        Id: "<<vectordatoC.at(0)<<"     Descripcion: "<<vectordatoC.at(1)<<"  Familia: "<<Util::intToString(idFamilia)<<endl;
                    }
               }
           }
       cout<<endl;
}

void Reporte::cantCopiniosPorFamilia(ABMCorpino *abmC, ABMFamilia *abmF){
	vector<string> vectorC = abmC->listar();
	vector<string> vectorF = abmF->listar();

	cout<<endl<<" Listado cantidad de productos por familia "<<endl<<endl;

	for(unsigned int i=0; i<vectorF.size();i++){
		string stringFamilia=vectorF.at(i);
		vector<string> vectordatoF=splitS(stringFamilia);
		unsigned int idFamilia=Util::stringToUint(vectordatoF.at(0));
		string descrFamilia=vectordatoF.at(1);
		int cantFamilia=0;

		for(unsigned int i=0; i<vectorC.size();i++){
			string stringCorpino=vectorC.at(i);
			vector<string> vectordatoC=splitS(stringCorpino);
			 if (Util::stringToUint(vectordatoC.at(7))==idFamilia) cantFamilia++;
		}
		cout<<"  Cantidad para familia "<<idFamilia <<", "<<descrFamilia<<": "<<cantFamilia<<endl;
	}
	cout<<endl;
}


void Reporte::cantCopiniosPorTintura(ABMCorpino *abmC, ABMTintura *abmT){
	vector<string> vectorC = abmC->listar();
	vector<string> vectorT = abmT->listar();

	cout<<endl<<" Listado cantidad de productos por tintura "<<endl<<endl;

	for(unsigned int i=0; i<vectorT.size();i++){
		string stringFamilia=vectorT.at(i);
		vector<string> vectordatoT=splitS(stringFamilia);
		unsigned int idTintura=Util::stringToUint(vectordatoT.at(0));
		string descrTintura=vectordatoT.at(1);
		int cantTintura=0;

		for(unsigned int i=0; i<vectorC.size();i++){
			string stringCorpino=vectorC.at(i);
			vector<string> vectordatoC=splitS(stringCorpino);
			 if (Util::stringToUint(vectordatoC.at(8))==idTintura) cantTintura++;
		}
		cout<<"  Cantidad para Tintura "<<idTintura <<", "<<descrTintura<<": "<<cantTintura<<endl;
	}
	cout<<endl;
}


void Reporte::listarCorpiniosPorFamilia(ABMCorpino *abmC, ABMFamilia *abmF){
	vector<string> vectorC = abmC->listar();
	vector<string> vectorF = abmF->listar();

	cout<<endl<<" Listado de corpiños por familia "<<endl<<endl;

	for(unsigned int i=0; i<vectorF.size();i++){
		string stringFamilia=vectorF.at(i);
		vector<string> vectordatoF=splitS(stringFamilia);
		unsigned int idFamilia=Util::stringToUint(vectordatoF.at(0));
		string descrFamilia=vectordatoF.at(1);
		cout<<endl<<"  Familia "<<idFamilia <<", "<<descrFamilia<<": "<<endl;
		for(unsigned int i=0; i<vectorC.size();i++){
			string stringCorpino=vectorC.at(i);
			vector<string> vectordatoC=splitS(stringCorpino);
			 if (Util::stringToUint(vectordatoC.at(7))==idFamilia) {
				 cout <<"        Id: "<<vectordatoC.at(0)<<"     Descripcion: "<<vectordatoC.at(1)<<endl;
			 }
		}
	}
	cout<<endl;
}

void Reporte::listarCorpiniosPorTintura(ABMCorpino *abmC, ABMTintura *abmT){
	vector<string> vectorC = abmC->listar();
	vector<string> vectorT = abmT->listar();

	cout<<endl<<" Listado de corpiños por tintura "<<endl<<endl;

	for(unsigned int i=0; i<vectorT.size();i++){
		string stringTintura=vectorT.at(i);
		vector<string> vectordatoT=splitS(stringTintura);
		unsigned int idtintura=Util::stringToUint(vectordatoT.at(0));
		string descrTintura=vectordatoT.at(1);
		cout<<endl<<"  Tintura "<<idtintura <<", "<<descrTintura<<": "<<endl;
		for(unsigned int i=0; i<vectorC.size();i++){
			string stringCorpino=vectorC.at(i);
			vector<string> vectordatoC=splitS(stringCorpino);
			 if (Util::stringToUint(vectordatoC.at(8))==idtintura) {
				 cout <<"        Id: "<<vectordatoC.at(0)<<"     Descripcion: "<<vectordatoC.at(1)<<endl;
			 }
		}
	}
	cout<<endl;
}

void Reporte::listarCorpiniosPorPartes(ABMCorpino *abmC, ABMCopa *abmCo, ABMBretel *abmB, ABMFormador *abmF){
	Instancia instancia = Instancia();
	unsigned int idActualBretel = instancia.obtenerIdBretel();
	unsigned int idActualCopa = instancia.obtenerIdCopa();
	unsigned int idActualFormador = instancia.obtenerIdFormador();

	vector<string> vectorC = abmC->listar();
	vector<string> vectorB = abmB->listar(idActualBretel);
	vector<string> vectorCo = abmCo->listar(idActualCopa);
	vector<string> vectorF = abmF->listar(idActualFormador);

	cout<<endl<<" Listado de corpiños por partes "<<endl<<endl;

	for(unsigned int i=0; i<vectorB.size();i++){
		string stringBretel=vectorB.at(i);
		vector<string> vectordatoB=splitS(stringBretel);
		unsigned int idBretel=Util::stringToUint(vectordatoB.at(0));
		string descrBretel=vectordatoB.at(1);
		cout<<endl<<"  Bretel "<<idBretel <<", "<<descrBretel<<": "<<endl;
		for(unsigned int i=0; i<vectorC.size();i++){
			string stringCorpino=vectorC.at(i);
			vector<string> vectordatoC=splitS(stringCorpino);
			 if (Util::stringToUint(vectordatoC.at(4))==idBretel) {
				 cout <<"        Id: "<<vectordatoC.at(0)<<"     Descripcion: "<<vectordatoC.at(1)<<endl;
			 }
		}
	}
	cout<<endl;

	for(unsigned int i=0; i<vectorF.size();i++){
		string stringFormador=vectorF.at(i);
		vector<string> vectordatoF=splitS(stringFormador);
		unsigned int idFormador=Util::stringToUint(vectordatoF.at(0));
		string descrFormador=vectordatoF.at(1);
		cout<<endl<<"  Formador "<<idFormador <<", "<<descrFormador<<": "<<endl;
		for(unsigned int i=0; i<vectorCo.size();i++){
			string stringCopa=vectorCo.at(i);
			vector<string> vectordatoCo=splitS(stringCopa);
			unsigned int idCopa=Util::stringToUint(vectordatoCo.at(0));
			 if (Util::stringToUint(vectordatoCo.at(1))==idFormador) {
				 for(unsigned int i=0; i<vectorC.size();i++){
				 		string stringCorp=vectorC.at(i);
				 		vector<string> vectordatoC=splitS(stringCorp);
				 		if (Util::stringToUint(vectordatoC.at(5))==idCopa) {
				 			cout <<"        Id: "<<vectordatoC.at(0)<<"     Descripcion: "<<vectordatoC.at(1)<<endl;
				 		}
				 }
			 }
		}
	}
	cout<<endl;

}

void Reporte::listarVentasPorFecha(ABMVentas *abmV, ABMCorpino *abmC){
               vector<string> vectorC = abmC->listar();
               vector<string> vectorV = abmV->listar();
               vector<string> vectorFecha;
               bool existe;

               cout<<endl<<" Listado de ventas por fecha "<<endl<<endl;

               for(unsigned int i=0; i<vectorV.size();i++){
                   string stringVentas=vectorV.at(i);
                   vector<string> vectordatoV=splitS(stringVentas);
                   unsigned int idVenta=Util::stringToUint(vectordatoV.at(0));

                   string fecha=vectordatoV.at(2);
                   existe=false;
                   for(unsigned int i=0;i<vectorFecha.size() ;i++){
                       if (splitS(vectorFecha.at(i)).at(0)==fecha) existe=true;
                       break;
                   }
                   if (!existe) vectorFecha.push_back(fecha+";"+Util::intToString(idVenta));

               }

               for(unsigned int i=0; i<vectorFecha.size();i++){
                   vector<string>vecFe=splitS(vectorFecha.at(i));
                   string stringFecha=vecFe.at(0);
                   cout<<endl<<"   Fecha "<<stringFecha<<": "<<endl<<endl;
                   unsigned int idVenta=Util::stringToUint(vecFe.at(1));
                   for(unsigned int i=0; i<vectorV.size();i++){
                       string stringVentas=vectorV.at(i);
                       vector<string> vectordatoV=splitS(stringVentas);
                        if (vectordatoV.at(2)==stringFecha){
                        string descCorp=abmC->buscar(Util::stringToInt(vectordatoV.at(4)));

                         cout <<"        Id: "<<vectordatoV.at(0)<<"     Precio: "<<vectordatoV.at(3)<<"  Cliente: "<<
                                 vectordatoV.at(1)<<"   Corpiño: "<<(splitS(descCorp)).at(1)<<endl;
                }
            }
        }
     cout<<endl;
}


void Reporte::listadoDeStock(ABMVentas *abmV, ABMCorpino *abmC){
	vector<string> vectorC = abmC->listar();
	vector<string> vectorV = abmV->listar();
	int cantCorp=0;

	cout<<endl<<" Listado de stock por Producto "<<endl<<endl;


	for(unsigned int i=0; i<vectorC.size();i++){
		string stringCorpino=vectorC.at(i);
		vector<string> vectordatoC=splitS(stringCorpino);
		unsigned int idCorp = Util::stringToUint(vectordatoC.at(0));
		string descrCorpino=vectordatoC.at(1);
		cantCorp++;
		int cantVentas=0;
		for(unsigned int i=0; i<vectorV.size();i++){
			string stringVentas=vectorV.at(i);
			vector<string> vectordatoV=splitS(stringVentas);
			if (Util::stringToUint(vectordatoV.at(4))==idCorp) cantVentas++;
		}
		int cantStock = 1-cantVentas;
		cout <<"        Id: "<<vectordatoC.at(0)<<"     Descripcion: "<<vectordatoC.at(1)<<"  Stock: "<<cantStock<<endl;
	}

	cout<<endl;
}





